异常处理的注意事项

  注意 ⚠️,必须在更一般的异常捕获之前为比较特殊的异常提供 catch 块。如果 catch 块的顺序有误,应用程序就会编译失败。还要注意可以在 catch 块中抛出异常,方法是使用上一个示例中的方式,或使用下述表达式:

        throw;

  这个表达式会再次抛出 catch 块处理过的异常。如果以这种方式抛出异常,该异常就不会由当前的 try...catch...finally 块处理,而是由上一级的代码处理(但嵌套结构中的 finally 块仍会执行)。

例如,如果修改 ThrowException() 中的 try...catch...finally 块,如下所示:

        try
        {
            Console.WriteLine("ThrowException(\"nested index\")" + 
                                "try block reached.");
            Console.WriteLine("ThrowException(\"index\") called.");
            ThrowException("index");
        }
        catch
        {
            Console.WriteLine("ThrowException(\"nested index\") general"
                                + " catch block reached.");
            throw;
        }
        finally
        {
            Console.WriteLine("ThrowException(\"nested index\") finally"
                                + "block reached.");
        }

  则首先执行其中的 finally 块,再执行 Main() 中匹配的 catch 块,得到的控制台输出 如图 7-20 所示

图 7-20

图 7-20

  在这个屏幕截图中,Main() 函数输出了额外的几行,因为这个函数捕获了 System.IndexOutOfRangeException 异常。

🔚